import delSpace from './delSpace.js';
import parseAttrString from './parseAttrString.js';

//parse是主函数
export default  function parse(templateString){
	//去除空格
	let _templateString = delSpace(templateString);
    // 指针
    let index =0;
    //定义收集标签的栈stack1
    let stack1 =[];
    // 定义收集文本内容的栈stack2
    let stack2 =[];
    // 字符串的剩余部分
    let rest = _templateString;
    //匹配字符串开始的正则规则
    let startRegExp =/^\<([a-z]+[1-6]?)(\s[^\<]*)?\>/;
    //匹配字符串结束的正则规则
    let endRegExp =/^\<\/([a-z]+[1-6]?)\>/; 
    //匹配字符串标签中内容的正则规则
    let textRegExp =/^([^\<]+)\<\/([a-z]+[1-6]?)\>/; 
    //结果数组
    let result =[];      
    //while循环开始
    while (index<_templateString.length-1){
    	// console.log(index)
    	rest = _templateString.substring(index);
    	// 如果剩余部分匹配到开始标签
    	if(startRegExp.test(rest)){
    		let startTag = rest.match(startRegExp)[1];
            let attrString = rest.match(startRegExp)[2];
            let attrStringLen = attrString?attrString.length:0;
    		// 不同标签不同的type值
    		let type ;
    		//将标签压入栈stack1,同时将一个空d对象容器压入栈stack2
    		stack1.push(startTag);
    		stack2.push({tag:startTag,attr:parseAttrString(attrString),children:[],type:type});
    		//指针后移起始标签位数+2在加上attrString位数，加上是要加上<>的两位
    		index += startTag.length +2+attrStringLen;
    		// console.log('开头标签是=》',startTag,attrString,attrStringLen);
    	}
    	// 如果剩余部分匹配到结束标签
    	else if(endRegExp.test(rest)){
    		let endTag = rest.match(endRegExp)[1];
    		//将stack1和stack2的栈顶一项都弹出
    		let stack1Pop = stack1.pop();
            let stack2Pop
    		// let stack2Pop = stack2.pop();
    		//判断stack1中弹出的项目是否和结束标签一样
    		if(stack1Pop==endTag){
    			// console.log('stack1中弹出的项目是否和结束标签一样')
    			//将弹出的stcak2的项追加到此时stack2的栈顶项的chilren上
    			if(stack2.length>0){
    				if(stack2.length>1){
    					stack2Pop = stack2.pop();
    				}
    			     stack2[stack2.length-1].children.push(stack2Pop);  				
    			}; 
    			// console.log('结束标签是=》',endTag,stack1,stack2)
    		}else{
    			throw Error(`</${endTag}>未闭合`)
    		};
    		//指针后移j结束标签位数+3，加上是要加上</>的3位
    		index+= endTag.length +3;
    	}
    	else if(textRegExp.test(rest)){
    		let text = rest.match(textRegExp)[1];
    		// console.log('标签中的内容是=》',text);
    		//将内容追加到stack2栈顶的text属性上
    		stack2[stack2.length-1]['text']=text;
    		index += text.length;
    	}
    	else{
    		console.log('其他情况')
    		index++
    	}
    	
    };
    // console.log('循环结束=》',stack1,stack2,result);

	return stack2[0];
}
